package com.devehx.wallet.comm;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.Objects;

/**
 * 合约地址和对应的小数位
 */
public enum ERC20 {

    ETH(Const.ETH_MIN_UNIT, "eth"),

    USDT(Const.USDT_MIN_UNIT, "0xdac17f958d2ee523a2206206994597c13d831ec7");

    public String address;

    public BigDecimal decimal;

    ERC20(BigDecimal decimal, String address) {
        this.decimal = decimal;
        this.address = address;
    }

    /**
     * 判断合约地址是否支持充值
     *
     * @param address 合约地址
     * @return true | false
     */
    public static boolean isOk(String address) {
        for (ERC20 erc20 : values()) {
            if (Objects.equals(address, erc20.address)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据合约地址获取对应的小数
     *
     * @param address 合约地址
     * @return 小数
     */
    public static BigDecimal decimal(String address) {
        for (ERC20 erc20 : values()) {
            if (Objects.equals(address, erc20.address)) {
                return erc20.decimal;
            }
        }
        return ETH.decimal;
    }

    /**
     * 将最小单位转换成最大单位（wei->ether）
     *
     * @param contactAddress 合约地址
     * @param intBalance     最小单位的余额
     * @return 最大单位的余额
     */
    public static BigDecimal toUnit(String contactAddress, BigInteger intBalance) {
        if (Objects.isNull(intBalance)) {
            return BigDecimal.ZERO;
        }
        BigDecimal decimal = decimal(contactAddress);
        return new BigDecimal(intBalance).divide(decimal, 10, RoundingMode.HALF_UP);
    }

}
